package com.qfdu.repo.db;

import java.sql.*;

/**
 * @author 沐辰
 * @version v1.0
 * @description: 手动配置JDBC连接
 * @project Qfed2401
 * @Date 2024/5/8 10:45
 * @company qf
 */
public class DBUtils {
    private static final String MYSQL_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String MYSQL_URL = "jdbc:mysql://127.0.0.1:3306/repo";
    private static final String MYSQL_USER = "root";
    private static final String MYSQL_PASSWORD = "20010610";

    private static Connection cnn;

    private static PreparedStatement psm;

    /**
     * jdbc连接数据库的步骤：
     * 1、加载驱动
     * 2、建立数据库的连接：url、user、pwd，返回数据库连接对象
     * 3、获取数据库预编译执行pst对象
     * 4、执行数据库操作int update(sql）、ResultSet query(sql)
     * 5、根据结果处理
     * 6、关闭连接、释放对象
     */
    static {
        try {
            Class.forName(MYSQL_DRIVER);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 该方法用于建立与数据库的连接，并返回连接对象
     *
     * @return 建立的数据库连接对象
     */
    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(MYSQL_URL,MYSQL_USER,MYSQL_PASSWORD);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return connection;
    }

    /**
     * 该方法用于执行数据库操作，接受两个参数，第一个参数带有？的sql语句
     *
     * @param sql      具体要执行的sql语句
     * @param callback 回调对象，用于调用者动态灵活的设置？的数据
     * @return
     */
    public static int executeUpdate(String sql,PstCallback callback) {
        cnn = getConnection();
        int result = -1;
        if (cnn != null) {
            try {
                psm = cnn.prepareStatement(sql);
                callback.pstSetValue(psm);
                result = psm.executeUpdate();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        return result;
    }

    /**
     * 该方法用于执行数据库查询操作
     * @param sql
     * @param pstCallback
     * @return
     */
    public static ResultSet query(String sql,PstCallback pstCallback){
        cnn = getConnection();
        ResultSet resultSet = null;
        if (cnn != null) {
            try {
                psm = cnn.prepareStatement(sql);
                if (pstCallback != null) {
                    pstCallback.pstSetValue(psm);
                }
                resultSet = psm.executeQuery();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        return resultSet;
    }

    /**
     * 该方法用于关闭数据库连接
     */
    public static void getClose(){
        try {
            if (cnn != null) {
                cnn.close();
            }
            if (psm != null) {
                psm.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
